package com.carrental.crm.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.carrental.crm.dto.CustomerDTO;
import com.carrental.crm.dto.CustomerLoginDTO;
import com.carrental.crm.dto.CustomerRegisterDTO;
import com.carrental.crm.entity.Customer;
import com.carrental.crm.vo.CustomerVO;

import java.util.Map;

/**
 * 客户服务接口
 */
public interface CustomerService extends IService<Customer> {

    /**
     * 创建客户
     *
     * @param customerDTO 客户DTO
     * @return 客户ID
     */
    Long createCustomer(CustomerDTO customerDTO);

    /**
     * 更新客户信息
     *
     * @param customerDTO 客户DTO
     * @return 是否成功
     */
    boolean updateCustomer(CustomerDTO customerDTO);

    /**
     * 根据ID获取客户详情
     *
     * @param id 客户ID
     * @return 客户VO
     */
    CustomerVO getCustomerById(Long id);

    /**
     * 根据用户ID获取客户详情
     *
     * @param userId 用户ID
     * @return 客户VO
     */
    CustomerVO getCustomerByUserId(Long userId);

    /**
     * 分页查询客户列表
     *
     * @param page     分页参数
     * @param name     客户姓名
     * @param phone    联系电话
     * @param idNumber 证件号码
     * @param type     客户类型
     * @param level    客户等级
     * @param status   客户状态
     * @return 客户VO分页
     */
    Page<CustomerVO> pageCustomers(Page<Customer> page, String name, String phone, String idNumber, Integer type,
            Integer level, Integer status);

    /**
     * 更新客户等级
     *
     * @param id    客户ID
     * @param level 客户等级
     * @return 是否成功
     */
    boolean updateCustomerLevel(Long id, Integer level);

    /**
     * 更新客户状态
     *
     * @param id     客户ID
     * @param status 客户状态
     * @return 是否成功
     */
    boolean updateCustomerStatus(Long id, Integer status);

    /**
     * 发送短信验证码
     *
     * @param phone 手机号
     * @return 是否成功
     */
    boolean sendSmsCode(String phone);

    /**
     * 客户注册
     *
     * @param registerDTO 注册信息
     * @return 是否成功
     */
    boolean register(CustomerRegisterDTO registerDTO);

    /**
     * 验证码登录
     *
     * @param loginDTO 登录信息
     * @return token
     */
    String loginBySms(CustomerLoginDTO loginDTO);

    /**
     * 获取当前登录客户信息
     *
     * @return 客户信息
     */
    CustomerVO getCurrentCustomerInfo();

    /**
     * 更新当前登录客户信息
     *
     * @param customerDTO 客户信息
     * @return 是否成功
     */
    boolean updateCustomerInfo(CustomerDTO customerDTO);

    /**
     * 退出登录
     *
     * @return 是否成功
     */
    boolean logout();

    Integer sendVerificationCode(String phoneNumber, String code);

    boolean sendNotification(String phoneNumber, Map<String, String> templateParams);

    boolean sendMarketing(String phoneNumber, Map<String, String> templateParams);
}